// pages/snack/snack.js
Page({

  data: {
    score:10,
    maxscore:900,
    startx:0,
    starty:0,
    endX:0,
    endY:0,
    ground:[],
    snake:[],
    food:[],
    direction:"",
    timer:"",//初始化定时器
    rows:28,  // 行数
    cols:22,   // 列数
    modalHidden:true
  },

  onLoad:function(option) {
    var maxscore=wx.getStorageSync("maxscore")
    if(!maxscore){
      maxscore=0
    }
    this.setData({
      maxscore:maxscore
    })
    this.initGround(this.data.rows, this.data.cols);
    this.initSnake(3);
    this.createFood()
    this.move()
    // console.log(this.data.snake)
    // console.log(this.data.snake.length)
  },

  // 计分器
  storeScore:function(){        // 这一部分没有问题了
    if(this.data.maxscore  < this.data.score){
      this.setData({
        maxscore:this.data.score
      })
      wx.setStorageSync("maxscore", this.data.maxscore)
    }
    // 完全可以放在if里面， 因为只有当 score大于maxscore时，才 需要处理这一块的逻辑
  },

  initGround: function(rows,cols){   // 这段完全没有问题
    for(var i=0;i<rows;i++){
      var arr=[];
      this.data.ground.push(arr);
      for(var j=0;j<cols;j++){
        this.data.ground[i].push(0)
      }
    }
  },

  initSnake:function(len){      // 这段也完全没有问题
    for(var i=0;i<len;i++){
      this.data.ground[0][i] = 1
      this.data.snake.push([0,i])
    }
    //console.log(this.data.snake)
  },

  createFood:function(){
    var x =Math.floor(Math.random()*this.data.rows)     // 这一段也完全没有问题
    var y =Math.floor(Math.random()*this.data.cols)
    var ground = this.data.ground
    var snake = this.data.snake
    ground[x][y]=2;
    for(var i=0; i<snake.length ;i++){
      var node = snake[i][1]
      //console.log(node)
      if(x == 0 && y == node){
        createFood()
        return;
      }else{
        this.setData({
          ground: ground,
          food: [x,y]
        })
    }
  }
  },

  tapStart:function (e) {   // 手指触摸这一块，没有问题
    // console.log("开始点击")
    //console.log(e)
    this.setData({
      startx:e.touches[0].pageX,
      starty:e.touches[0].pageY,
    })
    //console.log(starty)
  },

  tapMove: function(e){    // 触摸移动, 没有问题
    //console.log("移动")
    //console.log(e)
    this.setData({
      endX:e.touches[0].pageX,
      endY:e.touches[0].pageY
    })
  },

  tapEnd:function () {       // 触摸结束后的判断， 没有问题
    var heng = (this.data.endX)?this.data.endX-this.data.startx : 0
    var zong = (this.data.endY)?this.data.endY-this.data.starty : 0

    // 不能只动一点就算但是移动，所以有一个最低值限制
    if(Math.abs(heng)>5 || Math.abs(zong)>5){
      var direction = Math.abs(heng) > Math.abs(zong) ? this.computerDir(1,heng): this.computerDir(0,zong)
      switch(direction){
        case "left":
          if(this.data.direction=="right"){
            return;
          }
        break;
        case "right":
          if(this.data.direction=="left"){
            return
          }
        break;
        case "top":
          if (this.data.direction == "bottom") {
            return
          }
        break;
        case "bottom":
          if (this.data.direction == "top") {
            return
          }
        break;
      }
      this.setData({         // 走到这里表示给出的改变方向的操作是合法的
        direction:direction,
        startx:0,
        starty:0,
        endx:0,
        endy:0
      })

    }

    // if(Math.abs(heng) > Math.abs(zong) && heng>0){
    //   console.log("向右滑动")
    // }else if(Math.abs(heng) > Math.abs(zong) && heng<0){
    //   console.log("向左滑动")
    // }else if(Math.abs(heng) < Math.abs(zong) && zong<0){
    //   console.log("向上滑动")
    // }else if(Math.abs(heng) < Math.abs(zong) && zong>0){
    //   console.log("向下滑动")
    // }else{
    //   console.log("点击未滑动")
    // }
    // console.log(this.data.startx)
    // console.log(this.data.starty)
    // console.log(this.data.endX)
    // console.log(this.data.endY)
    // console.log(direction)
  },

  computerDir:function(heng, num){    // 判断手指滑动后要移动的方向
    if(heng){
      return (num>0)?"right":"left"
    }else{
      return (num>0)?"buttom":"top"
    }
  },

  move:function(){
    var that = this
    this.data.timer=setInterval(function(){     // 设置计时器
      that.changeDirection(that.data.direction)
      that.setData({
        ground:that.data.ground     // 这有什么意义呢 
      })
    },300)
  },

  // 游戏状态
  checkGame:function(snakeTAIL){
    var arr = this.data.snake;
    var len = this.data.snake.length;
    var snakeHEAD = arr[len-1]  // 拿到蛇头
    if(snakeHEAD[0]<0||snakeHEAD[0]>=this.data.rows||snakeHEAD[1]<0||snakeHEAD[1]>=this.data.cols)
    {
      // 如果判定超出了边界 ， 那么直接退出计时器， 然后游戏就结束了
      clearInterval(this.data.timer)      // 后面的这个 设置modalHidden为false 
      this.setData({
        modalHidden:false
      })
    }
    for(var i=0;i<len-1;i++){   // 这里检查的是蛇头和自己身体碰撞
      if(snakeHEAD[0] == arr[i][0] && snakeHEAD[1] == arr[i][1]){
        clearInterval(this.data.timer)
        this.setData({
          modalHidden:false
        })
      }
    }
    if(snakeHEAD[0]==this.data.food[0]&&snakeHEAD[1]==this.data.food[1]){
      arr.unshift(snakeTAIL)       // 这里判断的是吃到食物的情况 , 吃到之后的变化  
      this.setData({              // 这里是将增加的长度添到了尾部
        score:this.data.score+10
      })
      this.createFood()
      this.storeScore()
    }
  },

  changeDirection:function(dir){   // 改变方向
    console.log(dir)
    switch(dir){
      case "left":
        console.log("left")
        return this.changeLeft();
      break;
      case "right":
        console.log("right")
        return this.changeRight();
      break;
      case "top":
        console.log("top")
        return this.changeTop();
      break;
      case "buttom":          
        console.log("buttom")
        return this.changeBottom();
      break;
    }
    //console.log(dir)
  },

  changeLeft:function(){        // 这个具体的理解有待等会儿的测试   代码核对后没有问题的
    var arr=this.data.snake;
    var len=this.data.snake.length;
    var snakeHEAD= arr[len-1][1] // 这里为什么只拿了个纵坐标呢 （这里根本就没用）
    var snakeTAIL=arr[0]
    var ground=this.data.ground
    ground[snakeTAIL[0]][snakeTAIL[1]]=0  // 这个表现的是行走
    for(var i=0;i<len-1;i++){
      arr[i]=arr[i+1]
    }
    var x=arr[len-1][0]
    var y=arr[len-1][1]-1
    arr[len-1]=[x,y]
    this.checkGame(snakeTAIL)
    for(var i=1;i<len;i++){
      ground[arr[i][0]][arr[i][1]]=1
    }
    this.setData({
      ground:ground,
      snake:arr
    })
    return true;
  },

  changeRight:function(){
    var arr=this.data.snake;
    var len=this.data.snake.length;
    var snakeHEAD= arr[len-1][1] // 这里为什么只拿了个纵坐标呢
    var snakeTAIL=arr[0]
    var ground=this.data.ground
    ground[snakeTAIL[0]][snakeTAIL[1]] = 0  // 这个表现的是行走
    for(var i= 0 ; i < len-1 ; i++ ){
      arr[i]=arr[i+1] 
    }
    var x=arr[len-1][0]
    var y=arr[len-1][1]+1
    arr[len-1]=[x,y]        // 这里应该是表示给蛇设置新的位置
    this.checkGame(snakeTAIL)
    for(var i=1;i<len;i++){
      ground[arr[i][0]][arr[i][1]]=1
    }
    this.setData({
      ground:ground,
      snake:arr
    })
    return true;
  },

  changeTop: function(){
    var arr=this.data.snake;
    var len=this.data.snake.length;
    //var snakeHEAD= arr[len-1][1] // 这里为什么只拿了个纵坐标呢
    var snakeTAIL=arr[0]
    //var that = this
    var ground=this.data.ground
    ground[snakeTAIL[0]][snakeTAIL[1]] = 0  // 这个表现的是行走
    for(var i= 0 ; i < len-1 ; i++ ){
      arr[i]=arr[i+1] 
    }
    var x=arr[len-1][0]-1
    var y=arr[len-1][1]
    arr[len-1]=[x,y]        // 这里应该是表示给蛇设置新的位置
    this.checkGame(snakeTAIL)
    for(var i=0 ;i<len;i++){
      ground[arr[i][0]][arr[i][1]]=1
    }
    this.setData({
      ground:ground,
      snake:arr
    })
    return true;
  },

  // changeTop:function(){
  //   var arr = this.data.snake;
  //   var len = this.data.snake.length;
  //   //var snakeHEAD = arr[len - 1][1]
  //   var snakeTAIL = arr[0]
  //   var ground = this.data.ground
  //   ground[snakeTAIL[0]][snakeTAIL[1]] = 0
  //   for (var i = 0; i < len - 1; i++) {
  //     arr[i] = arr[i + 1]
  //   }
  //   var x = arr[len - 1][0]-1
  //   var y = arr[len - 1][1] 
  //   arr[len - 1] = [x, y]
  //   this.checkGame(snakeTAIL)
  //   for (var i = 0; i < len; i++) {      // 对于0位置呢  为什么设置值
  //     ground[arr[i][0]][arr[i][1]] = 1
  //   }
  //   this.setData({
  //     ground: ground,
  //     snake: arr
  //   })
  //   return true
  // },


  changeBottom: function () {
    var arr = this.data.snake;
    var len = this.data.snake.length;
    //var snakeHEAD = arr[len - 1][1]
    var snakeTAIL = arr[0]
    var ground = this.data.ground
    ground[snakeTAIL[0]][snakeTAIL[1]] = 0
    for (var i = 0; i < len - 1; i++) {
      arr[i] = arr[i + 1]
    }
    var x = arr[len - 1][0]+1
    var y = arr[len - 1][1] 
    arr[len - 1] = [x, y]
    this.checkGame(snakeTAIL)
    for (var i = 0; i < len; i++) {      // 对于0位置呢  为什么设置值
      ground[arr[i][0]][arr[i][1]] = 1
    }
    this.setData({
      ground: ground,
      snake: arr
    })
    return true
  },

  //点击确定触发的事件
  modalConfirm:function(){    // 这是点击了标签之后的事件
    this.setData({
      score:0,
      ground:[],
      snake:[],
      food:[],
      modalHidden:true,
      direction:""
    })
    this.onLoad()
  }


})